/*
ID: quxiao82
LANG: C++
PROG: stamps
*/
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <queue>
#include <algorithm>
using namespace std ;

const int NUM = 50;
const int MAX = 10000 * 200;
const int MAX_K = 201;

int stamps[NUM];
int k, n;
int minStamp[MAX];

void Input ()
{
       scanf( "%d%d", &k, &n);
       int i;
       for ( i = 0; i < n; i ++)
             scanf( "%d", &stamps[i]);
}

int getMinStamp (int v )
{
       int minS, i, tmp;
       minS = MAX_K;
       for ( i = 0; i < n && stamps[ i] <= v; i ++)
      {
             if ( minStamp[ v- stamps[ i]] != -1 && minStamp[ v- stamps[ i]] + 1 < minS )
                   minS = minStamp[ v- stamps[ i]] + 1;
      }
       if ( minS != MAX_K )
             minStamp[ v] = minS;
       return minS;
}

void Solve ()
{
       int i, tmp;
       sort( stamps, stamps+ n);
       memset( minStamp, -1, sizeof(minStamp));
       minStamp[0] = 0;
       for ( i = 1;; i ++)
      {
             tmp = getMinStamp( i);
//          printf("%d %d\n", i, tmp);
             if ( tmp > k )
                   break;
      }
       printf( "%d\n", i-1);
}

// void InitAllEven ()
// {
//    int i;
//    memset(allEven, 0, sizeof(allEven));
//    for (i = 0; i < n; i ++)
//    {
//          if ( stamps[i] & 1 )
//                allEven[i] = 1;
//          else
//                break;
//    }
// }
//
// void ExtendRet (int idx)
// {
//    if ( searchRet[idx] >= k )
//          return;
//    int i, tmp;
//    for (i = 0; i < n; i ++)
//    {
//          if ( (tmp = idx + stamps[i]) <= MAX )
//                searchRet[tmp] = searchRet[idx] + 1;
//    }
// }
//

// int Search(int totalValue, int stampIdx, int num)
// {
//    //    printf("%d %d %d\n", totalValue, stampIdx, num);
//    if ( num > k )
//          return 0;
//    if ( totalValue == 0 )
//          return num;
//    if ( stampIdx < 0 )
//          return 0;
//
//    while (stampIdx && totalValue < stamps[stampIdx])
//          -- stampIdx;
//    int i, t, tmp;
//    for (i = stampIdx; i >= 0; i --)
//    {
//          if ( totalValue % stamps[i] == 0
//                && ( (tmp=totalValue/stamps[i]) <= (k-num)) )
//                return tmp+num;
//    }
//
//    if ( allEven[stampIdx] && (totalValue&1) )
//          return 0;
//
// //       for (i = stampIdx; i >= 0; i --)
// //       {
// //             if ( totalValue-stamps[i] >= 0
// //                   && stamps[i]*(k-num) >= totalValue
// //                   && Search(totalValue-stamps[i], i, num+1) )
// //                   return true;
// //       }
//
//    t = totalValue / stamps[stampIdx];
//    for (i = t; i >= 0; i --)
//    {
//          if ( tmp = Search(totalValue-i*stamps[stampIdx], stampIdx-1, num+i) )
//                return tmp;
//    }
//    return 0;
// }
//
// void Solve ()
// {
//    int i, tmp, ret = 0;
//    sort(stamps, stamps+n);
//    InitAllEven();
//    for (i = 1;; i ++)
//    {
// //             if ( ret && ret < k && stamps[0] == 1 )
// //             {
// //                   ret ++;
// //                   continue;
// //             }
//          if ( !searchRet[i] )
//                searchRet[i] = Search(i, n-1, 0);
//          if ( !searchRet[i] )
//                break;
//          ExtendRet(i);
// //       printf("%d %d\n", i, searchRet[i]);
//    }
//    printf("%d\n", i-1);
// }

int main ()
{
       freopen( "stamps.in", "r" , stdin );
       freopen( "stamps.out", "w" , stdout );

       Input();
       Solve();

       return 0;
}
